<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // 曾经学习的给对象添加属性方式
    // 初始化对象
    // let obj = {name:'张脏宝'}
    // 点语法：给对象添加新属性
    // obj.age=18;
    // console.log(obj)
</script>
<script>
    // Object.defineProperty() 方法会直接在一个  对象上定义一个新的属性,或者修改一个对象现有的属性
    let obj = {age:'28',sex:'男'}
       //可以通过Object.definedProperty方法，给对象obj添加新的属性
    //    参数一：对象
    //    参数二：对象新增 已有的属性的属性名字
    //    参数三：描述符    对象【描述符】
    // 第三个参数：配置项【描述符：数据描述符 -> value、enumerable、writable、configurable】
    Object.defineProperty(obj,'name',{
        value:"开心没一天",  //obj添加了一个新的属性
        enumerable:true,    //enumerable属性值设置为真，代表新增的属性可以进行遍历，默认是false
        writable:true,       //代表新增的属性的属性值可以修改，默认初始值false
        configurable:true    //描述符，代表新增的属性可以删除，默认初始值false
    })

    for(v in obj){console.log(v)} //for in用于对数组或者对象的属性进行循环/迭代操作 
    obj.name='面条大虾'
    delete obj.name
    console.log(obj)



    // 读取描述符：get || getter      set || setter  ,方法 为函数
    Object.defineProperty(obj,'name',{
        // get在读取name的属性值得时候会触发
        // get方法执行返回结果作为属性的属性值
        get(){
            console.log('在读取name的属性值得时候会触发')
            return '我爱你1324'
        },
        set(val){
            // set方法执行，系统会注入一个参数，参数即为这个属性最新的属性值
            console.log(888,val)
        }
    })

    // set  设置name新的属性值
    obj.name = '巴啦啦小魔仙'
 
</script>